Unnamed2 Preview 1.0
Привет,
неизвестный путник! Здесь вы можете
просмотреть информацию об Unnamed2
Preview 1.0. Вы можете
скачать EXE или просмотреть
список изменений, скриншоты и/или видео.
Что
уже проверено и работает:
1. Не
транслятор, который просто исполняет,
а полноценный четырехпроходный
компилятор: лексический анализ (разбивает
на лексемы), предварительный анализ
(выделяет классы и функции), основной
анализ (строит синтаксическое дерево)
и вычислительный анализ (оптимизирует
синтаксическое дерево). (Я так думал,
что это был компилятор, но позже оказалось,
что я глубоко ошибался, и компилятор
мне, наверное, никогда не написать –
только транспайлер.) Список ошибок в
большинстве случаев работает корректно.
2.
Следующие операторы: + - * (в том числе
между строкой и числом) / % pow == > < >=
<= != ++ -- >> << ! n! !! ~ & | ^ && || ^^
(бинарный, true ^^ true ^^ true возвращает true)
and, or, xor (N-арный, true xor true xor true возвращает
false) = CombineWith () sin, cos, tan, asin, acos, atan, ln += -= *=
/= %= pow= &= |= ^= >>= <<= Infty, -Infty, Uncty, Pi,
E.
3. Следующие функции: Chain() (цепь целых
чисел в заданных границах), Choose() (выдает
ошибки, но работает), FillList() (заполняет
список одинаковыми значениями),
ListWithSingle() (выдает ошибки, но работает),
Abs(), Ceil(), Clamp() (эквивалентно Max(parameter2,
Min(parameter1, parameter3))), Fibonacci(), Floor(), Frac(),
IntRandom(), IntToReal() (принудительно преобразует
целое число в действительное), Log() (с
двумя параметрами), Max(), Max3(), Mean(), Mean3(),
Min(), Min3(), Random(), RealRemainder(), Round(), Sign(),
Truncate(), string.Compare(), string.Concat(), string.Join().
4.
Следующие полуфункции-полуоператоры:
ExecuteString(), Q().
5. Следующие типы: null,
bool, short int, unsigned short int, int, unsigned int, real (длиной
8 байт), string.
6. Блоки в фигурных
скобках.
7. Пользовательские классы
и функции (с ограничениями). Пример
объявления:
Class MyClass
//Class - с большой буквы
{
unsigned
int Function F1(unsigned int n) //Слово
Function
обязательно
{
return n * 2;
}
null
Function F2()
{
return null;
//Просто
"return;"
не катит
}
}
8. Условия.
9.
Возвраты.
10. Вызовы функций (как
встроенных, так и пользовательских).
11.
Автоматическое преобразование нескольких
конкатенаций строк в одно объединение
списка строк.
12. В случае применения
некоторых операторов к константам они
вычисляются на этапе компиляции.
13.
Среда исполнения, можно сказать, полностью
построена на try-catch, поэтому вероятность
вылета ничтожна. Скорее всего, просто
не вычислится одна функция или не
присвоится значение одной переменной
с выдачей соответствующего сообщения,
так как большинство рискованных операций
обернуты в свои блоки try-catch. В более
тяжелом случае произойдет крах, и может
также быть указанным место поломки (а
может и не быть указанным), так как каждый
этап компиляции и исполнения обернут
в глобальный блок try-catch. Наконец,
экстремальная ситуация, когда, например,
не удалась инициализация списка,
симулирующего стек вызовов - пишется,
что произошла серьезная ошибка и
программа не выполнена.
Что уже проверено
и не работает:
1. Модификаторы
доступа. Иногда их применение не выдает
ошибку, но в любом случае все классы и
функции являются открытыми.
2.
Глобальный доступ (public).
3. Модификаторы
параметров ref, out и params, а также ref в других
местах кода.
4. Тернарные операторы.
5.
Индексы и диапазоны.
6. Субординация
классов.
7. Константы.
8. Конструкторы
и деструкторы.
9. Рекурсивный тип.
10.
Циклы. Вместо них можно использовать
рекурсию или конструкцию ExecuteString("<SomeAction>"
* <NumberOfIterations>);.
11. Операторы break и
continue.
12. Оператор goto. Это плохой
оператор, он ухудшает структуру кода,
и мой язык отказался от его использования
умышленно.
13. Комментарии. В примерах
из этого сообщения они присутствуют,
но если вы хотите протестировать эти
примеры, комментарии придется убрать.
Что
уже проверено и работает с
ограничениями:
1. Все классы и
функции являются безэкземлярными
(oxyet).
2. Встроенные экземплярные
функции также не могут быть вызваны.
3.
Свойства. Работают только автосвойства,
не работают свойства только для чтения,
и чтобы обратиться к свойству, указывать
содержащий его класс обязательно!
Примеры допустимых объявлений и обращения
к свойствам:
Class MyClass
{
int
property
= 3;
real
property2{ get, set } = 2;
short
int property3{ get } = -8; //Так
нельзя
real
Function F()
{
return
MyClass.property + MyClass.property2;
return property +
property2; //Так
нельзя
}
}
4.
Списки. Можно вернуть список, использовать
его во встроенной функции (например,
string.Join()), вернуть из встроенной функции
(например, Chain()), но нельзя пользоваться
массивными и списочными типами и
обращаться к элементу списка под
каким-либо индексом.
5. Вследствие
предыдущего пункта, не работает выполнение
строки с параметрами (так как список
параметров имеет списочный тип). Вместо
этого можно использовать внедрение
параметров прямо в код в строке, они
будут неявно преобразованы в тип
string.
6. Отсутствует универсальный
оператор явного преобразования. Можно
только использовать функцию IntToReal(), ее
сокращение - суффикс "r" для чисел
(1 / 3 вернет 0, а 1r / 3 - 0.333...) и такие
конструкции, как n + "" или s
- 0, а также присваивание переменной
нужного типа.
7. Оператор is работает
только с null и типами, причем не создает
переменной с результатом преобразования
в нужный тип (конструкция a is type b не
работает). Вследствие того, что получаемая
переменная не всегда фиксируется, вы
можете обнаружить, что значение переменной
не того типа, которым эта переменная
была объявлена (например, после
присваивания int a = 5; a имеет тип не
int, а short int).
8. Могут быть проблемы с
вложенными условиями без блоков, лучше
не рисковать и вложить второе условие
в блок.
9. Ключевые слова Class и Function
пишутся с прописной буквы.
10.
Пользовательские пространства имен
находятся в разработке, пока что работают
просто как безымянные блоки (нельзя
обратиться к члену пространства имен
снаружи).
11. Не работают многие виды
ошибок и особенно предупреждений. Вообще
маловероятно встретить предупреждение.
Хотя фундаментальные ошибки работают.
12.
Список ошибок работает на конкатенации
строк, поэтому каждая ошибка ведет к
его пересозданию, и при большом количестве
ошибок компиляция может зависнуть.
Например, на моем компьютере, если будет
около 280 ошибок, компиляция, вероятно,
будет длиться где-то 5 минут.
13.
Вследствие того, что язык является
ультра-высокоуровневым, и того, что за
все в этой жизни надо платить, он работает
существенно медленнее просто
высокоуровневых языков, так же как
высокоуровневые языки - существенно
медленнее низкоуровневых. Особенно он
тормозит на рекурсии, которая работает
в куче, а не в стеке вызовов: например,
такой код:
real
Function F(unsigned int n)
{
if
(n <= 1)
{
return n;
}
return
F(n - 1) + F(n - 2);
}
return F(20);
- на моем
компьютере выполняется 22 минуты.
Все
остальное не проверено и, скорее
всего, не работает.
Скачивание EXE запрещено
Назад
ко всем версиям